Tras buscar en Google, aparecen algunas opciones que no conducen a ninguna parte.
curl -s http://fenicsproject.org/fenics-install.sh | bash
$ bash
$ conda create -n fenics27 python=2.7
$ source activate fenics27
(fenics27) $ conda install fenics mkl --channel juanlu001
Estos comandos instalan binarios precompilados, enlazados con MKL de Intel
$ conda install conda-build
$ conda build boost eigen3 petsc petsc4py instant ufl fiat ffc dolfin fenics --python 27
$ conda install fenics mkl --use-local
Resolver la ecuación de Poisson
$$ -\nabla^2 u = f \quad u \in \Omega,$$en el dominio $\Omega = [0, 1] \times [0, 1] \in \mathbb{R}^2$, siendo $f = 100\exp(-((x - 0.5)^2 + (y - 0.5)^2) / 0.02)$ el término forzante
y sometida a la condición de contorno $u = \sin{\left(2 \pi x^2\right)}$ en $\partial\Omega$.
In [10]:
from fenics import *
#from dolfin import *
In [2]:
mesh = UnitSquareMesh(8, 6)
mesh
Out[2]:
In [3]:
supported_elements
Out[3]:
Para nuestro problema concreto, vamos a utilizar los clásicos elementos polinómicos de Lagrange de orden 1:
In [4]:
V = FunctionSpace(mesh, 'Lagrange', 1)
u = TrialFunction(V)
v = TestFunction(V)
In [5]:
def boundary(x, on_boundary):
"""El parámetro on_boundary es verdadero si el punto está
sobre el contorno. Podríamos hacer otro tipo de comprobaciones,
pero en este caso basta con devolver este mismo valor.
"""
return on_boundary
u0 = Expression('sin(2 * pi * x[0] * x[0])')
bc = DirichletBC(V, u0, boundary)
Y ahora, la escribimos en Python:
In [6]:
f = Expression("100 * exp(-(pow(x[0] - 0.5, 2) + pow(x[1] - 0.5, 2)) / 0.02)")
a = inner(nabla_grad(u), nabla_grad(v)) * dx # Miembro izquierdo
L = f * v * dx
In [7]:
u = Function(V)
solve(a == L, u, bc)
print max(abs(u.vector().array())) # Array de valores numéricos
In [8]:
fig = plot(u, interactive=False)
fig.write_png("poisson")
In [9]:
from IPython.display import Image
Image("poisson.png")
Out[9]:
*[Formulación con funciones *penalty* para la ecuación biharmónica](http://fenicsproject.org/documentation/dolfin/1.5.0/python/demo/documented/biharmonic/python/documentation.html)
Existen otras soluciones para resolver ecuaciones diferenciales con Python: